/**
 * @file
 *
 * Header file contenente la gestione delle funzioni e delle macro per il debug.
 *
 * Nel modulo sono presenti dei livelli di debug abilitabili settando i relativi
 * bit nella variabile MASK:
 * * bit 0001: ::DBG_FUNCNAME visualizza il nome della funzione ed una breve
 *             descrizione
 * * bit 0010: ::DBG_BLOCDESC visualizza la descrizione del blocco
 * * bit 0100: ::DBG_GENERIC  visualizza informazioni generiche
 *
 * \note
 * Il modulo si può attivare definendo la direttiva <b>DEBUG_MODE</b> tramite
 * una di queste modalità:
 * * si tira via il commento davanti alla definizione <b>DEBUG_MODE</b> presente
 *   nel file debug_data.h;
 * * si inserisce il parametro <b>-D DEBUG_MODE</b> nella riga di commando di
 *   compilazione;
 * * si compila il software tramite il commando \code make debug \endcode.
 */

// Author: Adrian Sassatelli
// Copyright (c) 2014 Adrian Sassatelli


#include <iostream>

using namespace std;


/* -------------------------------------------------------------------------- */

/* Tirar via il commento per abilitare direttamente il modulo */
//#define DEBUG_MODE

/* -------------------------------------------------------------------------- */

/* Gestione header file delle asserzioni */
#ifndef DEBUG_MODE
    #define NDEBUG
#endif
#include <assert.h>

/* -------------------------------------------------------------------------- */

extern int MASK;    /**< Maschera per abilitare i vari livelli di debug
                     * (definita in minesweeperclone.cc) */

/* -------------------------------------------------------------------------- */

/**
 * MACRO - Macro principale per la gestione dei livelli di debug.
 */
#ifdef DEBUG_MODE
    #define DEB(A, B) {if ((A) & MASK) {B;}};
#else
    #define DEB(A, B)
#endif

/* -------------------------------------------------------------------------- */

/**
 * MACRO - Visualizza il nome della funzione ed una breve descrizione.
 *
 * Per abilitare il livello impostare il bit 0001 della variabile ::MASK.
 */
#define DBG_FUNCNAME(C, D) DEB(1, cout << "[" << C << "] " << D << "\n")

/* -------------------------------------------------------------------------- */

/**
 * MACRO - Visualizza descrizione blocco.
 *
 * Per abilitare il livello impostare il bit 0010 della variabile ::MASK.
 */
#define DBG_BLOCDESC(C) DEB(2, cout << "    " << C << "\n")

/* -------------------------------------------------------------------------- */

/**
 * MACRO - Visualizza informazioni generiche.
 *
 * Per abilitare il livello impostare il bit 0100 della variabile ::MASK.
 */
#define DBG_GENERIC(C) DEB(4, cout << "      " << C << "\n")

/* -------------------------------------------------------------------------- */
